﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Windows.ApplicationModel.Resources.Core;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging;
using System.Collections.Specialized;

// The data model defined by this file serves as a representative example of a strongly-typed
// model that supports notification when members are added, removed, or modified.  The property
// names chosen coincide with data bindings in the standard item templates.
//
// Applications may use this model as a starting point and build on it, or discard it entirely and
// replace it with something appropriate to their needs.

namespace App1.Data
{
    /// <summary>
    /// Base class for <see cref="SampleDataItem"/> and <see cref="SampleDataGroup"/> that
    /// defines properties common to both.
    /// </summary>
    [Windows.Foundation.Metadata.WebHostHidden]
    public abstract class DadosItemLivro : App1.Common.BindableBase
    {
        private static Uri _baseUri = new Uri("ms-appx:///");

        public DadosItemLivro(String codigo, String titulo, String subtitulo, String caminhoImagem, String descricao, string tipoExibicao)
        {
            this._codigo = codigo;
            this._titulo = titulo;
            this._subtitulo = subtitulo;
            this._descricao = descricao;
            this._caminhoImagem = caminhoImagem;
            this._tipoexibicao = tipoExibicao;
        }

        public DadosItemLivro(String codigo, String titulo, String subtitulo, ImageSource caminhoImagem, String descricao, string tipoExibicao)
        {
            this._codigo = codigo;
            this._titulo = titulo;
            this._subtitulo = subtitulo;
            this._descricao = descricao;
            this._imagem = caminhoImagem;
            this._tipoexibicao = tipoExibicao;
        }

        private string _tipoexibicao = string.Empty;
        public string TipoExibicao
        {
            get { return this._tipoexibicao; }
            set { this.SetProperty(ref this._tipoexibicao, value); }
        }

        private string _codigo = string.Empty;
        public string Codigo
        {
            get { return this._codigo; }
            set { this.SetProperty(ref this._codigo, value); }
        }

        private string _titulo = string.Empty;
        public string Titulo
        {
            get { return this._titulo; }
            set { this.SetProperty(ref this._titulo, value); }
        }

        private string _subtitulo = string.Empty;
        public string Subtitulo
        {
            get { return this._subtitulo; }
            set { this.SetProperty(ref this._subtitulo, value); }
        }

        private string _descricao = string.Empty;
        public string Descricao
        {
            get { return this._descricao; }
            set { this.SetProperty(ref this._descricao, value); }
        }

        private ImageSource _imagem = null;
        private String _caminhoImagem = null;
        public ImageSource Image
        {
            get
            {
                if (this._imagem == null && this._caminhoImagem != null)
                {
                    this._imagem = new BitmapImage(new Uri(DadosItemLivro._baseUri, this._caminhoImagem));
                }
                return this._imagem;
            }

            set
            {
                this._caminhoImagem = null;
                this.SetProperty(ref this._imagem, value);
            }
        }

        public void SetImage(String path)
        {
            this._imagem = null;
            this._caminhoImagem= path;
            this.OnPropertyChanged("Image");
        }

        public override string ToString()
        {
            return this.Titulo;
        }

       
    }

    /// <summary>
    /// Generic item data model.
    /// </summary>
    public class CapituloLivro : DadosItemLivro
    {
        public CapituloLivro(String codigo, String titulo, String subtitulo, String caminhoimagem, String descricao, String content, DadosCapitulosLivro capitulos, String tipoExibicao)
            : base(codigo, titulo, subtitulo, caminhoimagem, descricao, tipoExibicao)
        {
            this._conteudo = content;
            this._capitulos = capitulos;
        }

        private string _conteudo = string.Empty;
        public string Conteudo
        {
            get { return this._conteudo; }
            set { this.SetProperty(ref this._conteudo, value); }
        }

        private DadosCapitulosLivro _capitulos;
        public DadosCapitulosLivro Capitulos
        {
            get { return this._capitulos; }
            set { this.SetProperty(ref this._capitulos, value); }
        }
    }

    /// <summary>
    /// Generic group data model.
    /// </summary>
    public class DadosCapitulosLivro : DadosItemLivro
    {
        public DadosCapitulosLivro(String codigo, String titulo, String subtitulo, String caminhoimagem, String descricao, string tipoExibicao)
            : base(codigo, titulo, subtitulo, caminhoimagem, descricao, tipoExibicao)
        {
            Items.CollectionChanged += ItemsCollectionChanged;
        }

        public DadosCapitulosLivro(String codigo, String titulo, String subtitulo, ImageSource caminhoimagem, String descricao, string tipoExibicao)
            : base(codigo, titulo, subtitulo, caminhoimagem, descricao, tipoExibicao)
        {
            Items.CollectionChanged += ItemsCollectionChanged;
        }

        private void ItemsCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            // Provides a subset of the full items collection to bind to from a GroupedItemsPage
            // for two reasons: GridView will not virtualize large items collections, and it
            // improves the user experience when browsing through groups with large numbers of
            // items.
            //
            // A maximum of 12 items are displayed because it results in filled grid columns
            // whether there are 1, 2, 3, 4, or 6 rows displayed

            switch (e.Action)
            {
                case NotifyCollectionChangedAction.Add:
                    if (e.NewStartingIndex < 4)
                    {
                        TopItems.Insert(e.NewStartingIndex,Items[e.NewStartingIndex]);
                        if (TopItems.Count > 4)
                        {
                            TopItems.RemoveAt(4);
                        }
                    }
                    break;
                case NotifyCollectionChangedAction.Move:
                    if (e.OldStartingIndex < 4 && e.NewStartingIndex < 4)
                    {
                        TopItems.Move(e.OldStartingIndex, e.NewStartingIndex);
                    }
                    else if (e.OldStartingIndex < 4)
                    {
                        TopItems.RemoveAt(e.OldStartingIndex);
                        TopItems.Add(Items[3]);
                    }
                    else if (e.NewStartingIndex < 4)
                    {
                        TopItems.Insert(e.NewStartingIndex, Items[e.NewStartingIndex]);
                        TopItems.RemoveAt(4);
                    }
                    break;
                case NotifyCollectionChangedAction.Remove:
                    if (e.OldStartingIndex < 4)
                    {
                        TopItems.RemoveAt(e.OldStartingIndex);
                        if (Items.Count >= 4)
                        {
                            TopItems.Add(Items[3]);
                        }
                    }
                    break;
                case NotifyCollectionChangedAction.Replace:
                    if (e.OldStartingIndex < 4)
                    {
                        TopItems[e.OldStartingIndex] = Items[e.OldStartingIndex];
                    }
                    break;
                case NotifyCollectionChangedAction.Reset:
                    TopItems.Clear();
                    while (TopItems.Count < Items.Count && TopItems.Count < 4)
                    {
                        TopItems.Add(Items[TopItems.Count]);
                    }
                    break;
            }
        }

        private ObservableCollection<CapituloLivro> _items = new ObservableCollection<CapituloLivro>();
        public ObservableCollection<CapituloLivro> Items
        {
            get { return this._items; }
        }

        private ObservableCollection<CapituloLivro> _topItem = new ObservableCollection<CapituloLivro>();
        public ObservableCollection<CapituloLivro> TopItems
        {
            get {return this._topItem; }
        }
    }

    /// <summary>
    /// Creates a collection of groups and items with hard-coded content.
    /// 
    /// SampleDataSource initializes with placeholder data rather than live production
    /// data so that sample data is provided at both design-time and run-time.
    /// </summary>
    public sealed class DataSourceLivro
    {
        private static DataSourceLivro _datasroucelivro = new DataSourceLivro();

        private ObservableCollection<DadosCapitulosLivro> _todoscapitulos = new ObservableCollection<DadosCapitulosLivro>();
        
        public ObservableCollection<DadosCapitulosLivro> TodosCapitulos
        {
            get { return this._todoscapitulos; }
        }

        public ObservableCollection<CapituloLivro> GetPagina(string Codigo)
        {
           return this._todoscapitulos[0].Items; 
        }

        public static IEnumerable<DadosCapitulosLivro> GetCapitulos(string codigo)
        {
            if (!codigo.Equals("TodosCapitulos")) throw new ArgumentException("Only 'TodosCapitulos' is supported as a collection of groups");
            
            return _datasroucelivro.TodosCapitulos;
        }

        public static DadosCapitulosLivro GetCapitulo(string codigo)
        {
            // Simple linear search is acceptable for small data sets
            var matches = _datasroucelivro.TodosCapitulos.Where((group) => group.Codigo.Equals(codigo));
            if (matches.Count() == 1) return matches.First();
            return null;
        }

        public static CapituloLivro GetItem(string codigo)
        {
            // Simple linear search is acceptable for small data sets
            var matches = _datasroucelivro.TodosCapitulos.SelectMany(group => group.Items).Where((item) => item.Codigo.Equals(codigo));
            if (matches.Count() == 1) return matches.First();
            return null;
        }


        private string TemaAtual = "peixonauta";

        public DataSourceLivro()
        {
            String ITEM_CONTENT = String.Format("Item Content: {0}",
                        "Nyke Daenerys Jelmāzmo hen Targārio Lentrot, hen Valyrio Uēpo ānogar iksan. Valyrio muño ēngos ñuhys issa.");

            var Capitulo1 = new DadosCapitulosLivro("Group-1",
                    "1º capitulo",
                    "Subitulo do capitulo",
                    "../Assets/temas/"+TemaAtual+"/capitulos/1.jpg",
                    "Dovaogēdys! Naejot memēbātās! Kelītīs! Nyke Daenerys Jelmāzmo hen Targārio Lentrot, hen Valyrio Uēpo ānogar iksan. Nyke Daenerys Jelmāzmo hen Targārio Lentrot, hen Valyrio Uēpo ānogar iksan. Valyrio muño ēngos ñuhys issa. Zaldrizes buzdari iksos daor.", 
                    "CapituloFinalizado");
            Capitulo1.Items.Add(new CapituloLivro("Group-1-Item-1",
                    "Titulo da página do livro",
                    "Subtitulo da página",
                    "../Assets/temas/"+TemaAtual+"/paginas/1.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula.",
                    "Valar Morgulis. Dovaogēdys! Naejot memēbātās! Kelītīs! Nyke Daenerys Jelmāzmo hen Targārio Lentrot, hen Valyrio Uēpo ānogar iksan. ",
                    Capitulo1, "PaginaLida"));
            Capitulo1.Items.Add(new CapituloLivro("Group-1-Item-2",
                    "Titulo da página do livro",
                    "Subtitulo da página",
                    "../Assets/temas/"+TemaAtual+"/paginas/2.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    "Valar Morgulis. Dovaogēdys! Naejot memēbātās! Kelītīs! Nyke Daenerys Jelmāzmo hen Targārio Lentrot, hen Valyrio Uēpo ānogar iksan. ",
                    Capitulo1, "PaginaLida"));
            Capitulo1.Items.Add(new CapituloLivro("Group-1-Item-3",
                    "Titulo da página do livro",
                    "Subtitulo da página",
                    "../Assets/temas/"+TemaAtual+"/paginas/4.jpg",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    "Valar Morgulis. Dovaogēdys! Naejot memēbātās! Kelītīs! Nyke Daenerys Jelmāzmo hen Targārio Lentrot, hen Valyrio Uēpo ānogar iksan. ",
                    Capitulo1, "PaginaLida"));
            Capitulo1.Items.Add(new CapituloLivro("Group-1-Item-4",
                   "Titulo da página do livro",
                    "Subtitulo da página",
                    "../Assets/temas/"+TemaAtual+"/paginas/5.jpg",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    Capitulo1, "PaginaLida"));

            this.TodosCapitulos.Add(Capitulo1);

            var Capitulo2 = new DadosCapitulosLivro("Group-2",
                    "2º Capitulo",
                    "Subtitulo do capitulo",
                    "../Assets/temas/" + TemaAtual + "/capitulos/1.jpg",
                    "Group Description: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus tempor scelerisque lorem in vehicula. Aliquam tincidunt, lacus ut sagittis tristique, turpis massa volutpat augue, eu rutrum ligula ante a ante", "CapituloEmLeitura");
            Capitulo2.Items.Add(new CapituloLivro("Group-2-Item-1",
                    "1ª Página",
                    "Subtitulo do capitulo",
                    "../Assets/temas/"+TemaAtual+"/paginas/1.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                   Capitulo2, "UltimaPaginaLida"));
            Capitulo2.Items.Add(new CapituloLivro("Group-2-Item-2",
                    "2ª Página",
                    "Subtitulo do capitulo",
                    "../Assets/temas/"+TemaAtual+"/paginas/2.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    Capitulo2, "PaginaLida"));
            Capitulo2.Items.Add(new CapituloLivro("Group-2-Item-3",
                    "3ª Página",
                    "Subtitulo do capitulo",
                    "../Assets/temas/"+TemaAtual+"/paginas/3.jpg",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    Capitulo2, "PaginaNaoLida"));
            Capitulo2.Items.Add(new CapituloLivro("Group-2-Item-4",
                    "4ª Página",
                    "Subtitulo do capitulo",
                    "../Assets/temas/"+TemaAtual+"/paginas/4.jpg",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    Capitulo2, "PaginaNaoLida"));
            Capitulo2.Items.Add(new CapituloLivro("Group-2-Item-5",
                    "5ª Página",
                    "Subtitulo do capitulo",
                    "../Assets/temas/"+TemaAtual+"/paginas/5.jpg",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    Capitulo2, "PaginaNaoLida"));

            this.TodosCapitulos.Add(Capitulo2);


          
          
        }
    }
}
